import { inject, injectable } from 'inversify';
import { PrismaDB } from '../db';
import { UserDto } from './user.dto';
import { plainToClass } from 'class-transformer';
import { validate } from 'class-validator';
import { JWT } from '../jwt';
/**
 * 所有的类必须被 @injectable() 装饰器装饰。如果你的类有一个对类的依赖，这样就够了：
 * 如果你的类有一个对接口的依赖，你还需要使用 @inject 装饰器。
 */
@injectable() // 将这个模块注入到容器内部,类似于springboot中的@Service注解
export class UserService {
	constructor(@inject(PrismaDB) private readonly PrismaDB: PrismaDB,  @inject(JWT) private readonly jwt: JWT) {}
	public async getList() {
		return await this.PrismaDB.prisma.user.findMany();
	}

	public async addUser(data: UserDto) {
		let user = plainToClass(UserDto, data);
		const errors = await validate(user);
		const dto = [];
		if (errors.length) {
			errors.forEach(error => {
				Object.keys(error.constraints).forEach(key => {
					dto.push({
						[error.property]: error.constraints[key]
					});
				});
			});
			return dto;
		} else {
			const result = await this.PrismaDB.prisma.user.create({ data: user });
			return {
				...result,
				// 生成token并返回给前端
				token: this.jwt.createToken(result)
			}
		}
	}
}
